Controle de Ambiente

Jornada de Open Science na Prática

Dr. Pablo Rogers

Objetivos da Aula


  • 🔄 Compreender níveis de controle de ambiente (VMs, Containers, renv)
  • 📦 Distinguir pacotes (renv) de ambiente completo (Docker)
  • 🐳 Operar Docker Desktop via interface gráfica
  • 🔧 Combinar renv + Docker para reprodutibilidade completa
  • 📊 Aplicar conceitos no template ARTE
  • 🚀 Compartilhar ambientes reprodutíveis

O Problema: “Uai, Comigo Funcionou!”


Situação hipotética:

  • 📊 Você publica pesquisa quantitativa com código e dados
  • 🌍 Pesquisador da Polônia tenta reproduzir
  • Não consegue replicar os resultados
  • 🤔 “Uai, comigo funcionou!”

Por que isso acontece?

  • Diferentes versões de pacotes
  • Diferentes sistemas operacionais
  • Diferentes bibliotecas do sistema
  • Diferentes versões do R

Evolução Histórica da Solução


Antigamente (anos 2000):

  • 💾 Enviar imagem completa do HD
  • ⚠️ Arquivos gigantes (GB)
  • ⚠️ Requer infraestrutura complexa
  • ⚠️ Incompatível entre sistemas

Hoje (2025):

  • ☁️ Armazenamento em nuvem
  • 🖥️ Virtualização (VMs)
  • 🐳 Containers (Docker)
  • 📦 Controle de pacotes (renv, Conda)

Soluções para Controle de Ambiente


Máquinas Virtuais (VMs)


O que são:

  • Emulam sistema operacional completo
  • Cada VM = SO próprio + bibliotecas + apps
  • Tipo 1: roda direto no hardware (VMware ESXi, Hyper-V, Xen)
  • Tipo 2: roda sobre SO existente (VirtualBox, VMware Workstation)

Vantagens/Desvantagens:

  • ✅ Alto isolamento e segurança
  • ✅ Executa diferentes SOs
  • ❌ Consome muitos recursos (CPU, RAM, disco)
  • ❌ Imagens grandes e difíceis de compartilhar
  • Impraticável para reprodutibilidade científica

Uso em pesquisa:

  • Ferramenta útil para ensino/testes
  • Este curso está rodando numa VM!

Containers: A Solução Ideal


O que são:

  • Virtualização a nível de SO
  • Compartilham kernel do host
  • Contêm apenas app + dependências
  • Ferramentas: Docker, Kubernetes, Podman

Analogia útil:

  • 📝 Imagem Docker = receita de bolo
  • 🎂 Container Docker = bolo pronto
  • 🍰 Receita pode fazer infinitos bolos
  • 📤 Receita fácil de compartilhar

Vantagens:

  • ✅ Leves e eficientes
  • ✅ Rápidos (inicialização em segundos)
  • ✅ Fáceis de distribuir
  • Resolvem “dependency hell”

Docker em Pesquisa:

  • Ganhando força na ciência (Moreau et al., 2023)
  • Empacota código + dependências + SO
  • Qualquer pessoa, qualquer computador → mesmos resultados
  • Reprodutibilidade completa garantida

Ferramentas de Controle de Dependências


Conda (Python/R multi-linguagem):

  • Gerencia pacotes e ambientes virtuais
  • Cria ambientes isolados com versões específicas
  • Popular em ciência de dados

renv (específico para R):

  • Biblioteca privada por projeto
  • Arquivo renv.lock registra versões exatas
  • renv::restore() recria ambiente
  • Cache global evita duplicação

Vantagens/Limitações:

  • ✅ Menor overhead de recursos
  • ✅ Fácil configurar e usar
  • ✅ Promove reprodutibilidade de pacotes
  • ⚠️ Não controla versão do R
  • ⚠️ Não controla SO ou bibliotecas do sistema
  • ⚠️ Depende de disponibilidade futura de pacotes

Conclusão:

  • renv mitiga incompatibilidade
  • Docker resolve completamente

Combinando renv + Docker: O Melhor dos Dois Mundos


Por que combinar?

  • 📦 renv: gerencia pacotes R
  • 🐳 Docker: gerencia ambiente completo
  • 🤝 renv facilita construção de containers
  • 🔒 Docker garante reprodutibilidade total

Workflow recomendado:

  1. Desenvolver projeto com renv ativo
  2. renv::snapshot() cria renv.lock
  3. Dockerfile usa renv.lock para instalar pacotes
  4. Container inclui R + SO + pacotes exatos

Rocker Project

O que é:

  • Imagens Docker otimizadas para R
  • rocker/rstudio: RStudio Server em container
  • Versões fixas: rocker/verse:4.5.1
  • Base confiável para pesquisa

Benefício final:

  • ✅ Qualquer pessoa, qualquer lugar, qualquer momento
  • ✅ Resultados idênticos garantidos
  • ✅ Supera limitações de renvisolado

Docker Desktop: Interface Amigável


O que é:

  • Interface gráfica (GUI) para Docker
  • Ideal para pesquisadores não acostumados com CLI
  • Remove necessidade de comandos complexos

Funcionalidades principais:

  • 👀 Visualizar containers em execução
  • ▶️ Iniciar/parar com um clique
  • 📊 Acessar logs e informações
  • 🖼️ Gerenciar imagens
  • ⚙️ Configurar recursos (CPU, RAM)

Docker Desktop + RStudio Server

RStudio em Container:

  • 🌐 Acesso via navegador web (localhost:8787)
  • 💻 Experiência familiar do RStudio
  • 🔒 Todas garantias de reprodutibilidade

Foco do curso:

  • ✅ Tudo via GUI do Docker Desktop
  • ✅ Demonstrações com compartilhamento de tela
  • ✅ Comandos básicos apenas ao final (opcional)

Soluções em Nuvem: Alternativas Práticas


Notebooks na nuvem (básico):

Ambientes gerenciados (intermediário):

  • Binder: transforma repos Git em ambientes executáveis
  • JupyterHub: controle centralizado de ambientes
  • ✅ Melhor controle, mas requer configuração

Plataformas científicas (avançado):

  • Code Ocean: “cápsulas” reprodutíveis
  • Nextjournal: notebooks interativos + containers
  • ✅ Alto nível de reprodutibilidade
  • ✅ Interface intuitiva
  • ⚠️ Soluções comerciais (limitações de recursos)

Relação com Docker:

  • Todas usam conteinerização nos bastidores
  • Abstraem complexidade técnica
  • Tornam Docker acessível via GUI web

ARTE: Reprodutibilidade em Três Níveis


Nível Mínimo (Módulo 4):

  • 📁 TIER Protocol 4.0
  • ☁️ OSF para compartilhamento
  • ✅ Organização básica

Nível Adequado (Módulos 5-6):

  • 🔧 Git/GitHub
  • 📝 RStudio + Quarto
  • 📦 renv
  • ✅ Reprodutibilidade de código e pacotes

Nível Completo (Este módulo - Padrão Ouro):

  • 🐳 Docker
  • ✅ Encapsula tudo: SO + R + pacotes
  • ✅ Garantia de execução idêntica
  • ✅ Reprodutibilidade computacional completa

Implementação prática:

  • Scripts start.bat/stop.bat (Windows)
  • Scripts start.sh/stop.sh (Linux/Mac)
  • Automatizam criação e execução
  • Dockerfile + docker-compose.yml incluídos

ARTE: Automação com Scripts


Estrutura no repositório:

article-template/
├── docker/
│   ├── Dockerfile
│   ├── docker-compose.yml
│   ├── start.bat        \# Windows
│   ├── stop.bat         \# Windows
│   ├── start.sh         \# Linux/Mac
│   └── stop.sh          \# Linux/Mac
└── renv.lock

O que os scripts fazem:

  • 🔨 Constroem imagem Docker
  • ▶️ Iniciam container com RStudio Server
  • 🌐 Expõem porta 8787
  • 📂 Montam diretório do projeto

Uso na prática:

  • Window duplo clique em start.bat
  • No Linux/Mac dua clique em start.sh

Resultado:

  • Navegador abre http://127.0.0.x:8787
  • RStudio Server pronto para uso
  • Ambiente idêntico ao dos autores
  • Reprodução em um clique!

Níveis de Reprodutibilidade: Comparação


Solução Pacotes R SO Bibliotecas Sistema Nível
Google Colab ⚠️ Básico
Posit Cloud ⚠️ ⚠️ Básico
Binder ⚠️ ⚠️ Intermediário
JupyterHub ⚠️ ⚠️ Intermediário
renv ⚠️ Intermediário
Code Ocean Alto
Nextjournal Alto
Docker local Completo

Workflow Prático: Do Desenvolvimento ao Container


Fase 1: Desenvolvimento (local)

  1. Criar projeto RStudio + renv
  2. Desenvolver análise normalmente
  3. renv::snapshot() continuamente
  4. Git para versionamento

Fase 2: Conteinerização

  1. Escrever Dockerfile usando renv.lock
  2. Testar construção de imagem
  3. Re-executar análise dentro do container
  4. Verificar resultados idênticos

Fase 3: Compartilhamento

  1. Push código + Dockerfile para GitHub
  2. (Opcional) Push imagem para Docker Hub
  3. Documentar no README

Pesquisadores reproduzem:

  • Clone repo GitHub
  • docker build ou docker pull (sem ARTE)
  • docker run → RStudio Server (sem ARTE)
  • Executar análise
  • Resultados idênticos!

Comandos Docker Essenciais (Opcional)


Gerenciamento de imagens:

# Baixar imagem do Docker Hub

docker pull rocker/rstudio:4.3.2

# Listar imagens locais

docker images

# Construir imagem do Dockerfile

docker build -t meu-projeto:1.0 .

# Remover imagem

docker rmi meu-projeto:1.0

Gerenciamento de containers:

# Executar container

docker run --rm -p 8787:8787 \
-e PASSWORD=senha123 rocker/verse:4.5.1

# Listar containers em execução

docker ps

# Parar container

docker stop tainer-id>

# Remover container

docker rm tainer-id>

Boas Práticas: Dockerfile para Pesquisa


# Fixar versão específica do R

FROM rocker/verse:4.5.1

# Instalar dependências do sistema (se necessário)

RUN apt-get update \&\& apt-get install -y \
libcurl4-openssl-dev \
libssl-dev

# Copiar renv.lock para o container

COPY renv.lock /home/rstudio/renv.lock

# Instalar renv e restaurar pacotes

RUN R -e "install.packages('renv')"
WORKDIR /home/rstudio
RUN R -e "renv::restore()"

# Copiar projeto completo

COPY . /home/rstudio/meu-projeto

# Ajustar permissões

RUN chown -R rstudio:rstudio /home/rstudio

Checklist: Reprodutibilidade Completa ✅


Organização (Módulos 4-6):

  • ☑️ TIER Protocol seguido
  • ☑️ Git/GitHub ativo
  • ☑️ README completo
  • ☑️ Dados em repositório confiável (OSF, Zenodo)
  • ☑️ Código documentado (Quarto)

Controle de Ambiente (Este módulo):

  • ☑️ renv.lock atualizado
  • ☑️ Dockerfile funcional
  • ☑️ Imagem Docker testada
  • ☑️ Análise re-executada em container
  • ☑️ Resultados conferidos (idênticos)

Compartilhamento:

  • ☑️ Repositório GitHub público
  • ☑️ Licença explícita (MIT, CC-BY)
  • ☑️ DOI obtido (Zenodo)
  • ☑️ Instruções claras no README
  • ☑️ (Opcional) Imagem no Docker Hub

Teste final:

  • 🧪 Colega consegue clonar e executar?
  • 🧪 Container inicia sem erros?
  • 🧪 Resultados são reproduzidos?
  • Se sim: reprodutibilidade completa!

Limitações e Considerações


Curva de aprendizado:

  • Docker tem conceitos novos (imagens, containers, volumes)
  • Docker Desktop simplifica, mas ainda requer familiarização
  • Investimento inicial compensa no longo prazo

Requisitos técnicos:

  • Windows: virtualização habilitada no BIOS (WSL2)
  • Mac: funciona nativamente (Intel ou Apple Silicon)
  • Linux: instalação mais direta
  • ⚠️ Instalação pode levar tempo - fazer com antecedência

Quando Docker pode ser excessivo:

  • Projetos muito simples (script único + dados tabulares)
  • Análises puramente descritivas sem dependências complexas
  • Situações onde renv sozinho é suficiente

Quando Docker é essencial:

  • Dependências do sistema (bibliotecas C++, compiladores)
  • Análises complexas com múltiplas linguagens
  • Replicações pré-registradas
  • Artigos metodológicos
  • Preservação de longo prazo (>5 anos)

Recursos para Aprofundamento